<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>面向对象（选项卡）</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        ul, ol, li {
            list-style: none;
        }

        .tab {
            width: 600px;
            height: 400px;
            /*border: 1px solid #333;*/
            margin: 50px auto;
            display: flex;
            flex-direction: column;

            -moz-user-select: none; /*火狐*/
            -webkit-user-select: none; /*webkit浏览器*/
            -ms-user-select: none; /*IE10*/
            -khtml-user-select: none; /*早期浏览器*/
            user-select: none;
        }

        ul {
            height: 60px;
            display: flex;
        }

        ul > li {
            flex: 1;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 30px;
            color: #fff;
            background-color: skyblue;
            border-right: 1px solid #fff;
            border-left: 1px solid #fff;
            cursor: pointer;
        }

        ul > li.active {
            background-color: orange;
        }

        ol {
            flex: 1;
            position: relative;
        }

        ol > li {
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            font-size: 60px;
            display: flex;
            justify-content: center;
            align-items: center;
            color: #fff;
            background-color: pink;
            border-right: 1px solid #fff;
            border-left: 1px solid #fff;
            box-sizing: border-box;
        }

        ol > li.active {
            z-index: 999;
        }

    </style>
</head>
<body>

<div class="tab" id="tab1">
    <ul>
        <li class="active">1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <ol>
        <li class="active">1</li>
        <li>2</li>
        <li>3</li>
    </ol>
</div>

<div class="tab" id="tab2">
    <ul>
        <li class="active">1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>
    <ol>
        <li class="active">1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ol>
</div>

<script>
    /*
        简单版本的面向对象选项卡要求：

        1.抽象内容
          + 一个能完成选项卡的对象，需要有哪些属性和办法
            + 属性1：所有可以点击的盒子
            + 属性2：所有可以切换的盒子
            + 办法：能添加点击事件的办法
        2.书写构造函数
          + 创建一个对象包含两个属性、一个办法
          + 属性直接写在构造函数体内
          + 办法写在构造函数的原型（prototype）上
    */

    //书写构造函数
    function Tabs(ele) {
        //范围
        this.ele = document.querySelector(ele)
        //在范围内找到所有可以点击的盒子
        this.btns = this.ele.querySelectorAll('ul>li')
        //在范围内找到所有可以切换的盒子
        this.boxs = this.ele.querySelectorAll('ol>li')
    }

    //在构造函数的原型上书写办法
    Tabs.prototype.change = function () {
        //提前保存this
        const _this = this;

        this.btns.forEach(function (item, index) {
            //提前保存索引
            // item.setAttribute('index',index)

            //给所有btns按钮添加上点击事件
            item.onclick = function () {
                //需要让btns和boxs里面每一个都没有active类名
                //但是这里不再是change的作用域了，而是事件处理函数的作用域，也就是点击按钮绑定事件的作用域
                //用提前保存好的_this:也是change作用域的this，发现自己作用域内没有_this，就去父级找
                _this.btns.forEach(function (t,i) {
                    t.className = ''
                    _this.boxs[i].className = ''
                })
                item.className = 'active'
                _this.boxs[index].className = 'active'
            }
        })
    }

    //使用构造函数
    const t = new Tabs('#tab1');

    /*
    实例对象在调用办法时的调用方式为：对象.方法名()
    方法内部的this指的就是对象，所以在change中写this就是t
    */
    t.change()

    document.write('<br>')

    const t1 = new Tabs('#tab2');
    t1.change()
</script>
</body>
</html>